/*
  promsie的问题：本质还是基于回调，如果逻辑很复杂还是会有回调代码
  我们希望我们写的代码更像是同步的写法
  generator 生成器
*/

function gen$(context) {
  while (true) {
    switch ((context.prev = context.next)) {
      case 0:
        context.next = 1;
        return 1;
      case 1:
        context.next = 2;
        return 2;
      case 2:
        context.next = 3;
        return 3;
      case 3:
        context.shop();
        return 100;
    }
  }
}

function gen() {
  const context = {
    prev: 0, // 当前要运行的
    next: 0, // 下一个要走的
    done: false, // 是否完成运行
    shop() {
      this.done = true; // 更改完成标识
    },
  };
  return {
    next() {
      return {
        value: gen$(context),
        done: context.done,
      };
    },
  };
}

/* function* gen() {
  yield 1;
  yield 2;
  yield 3;
} */
const it = gen();
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: undefined, done: true }
